home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fatted Calf
/
The Fatted Calf.iso
/
Applications
/
Audio
/
Patchmix
/
Source
/
Allpass.m
< prev
next >
Wrap
Text File
|
1992-08-18
|
6KB
|
243 lines
/* Generated by Interface Builder */
#import "Allpass.h"
#import "Instrum.h"
#import <appkit/graphics.h>
#import "Statement.h"
@implementation Allpass
+ initialize
{
image = [NXImage findImageNamed:"Allpass"];
rvtOffset.x = 3;
rvtOffset.y = 30;
inOffset.x = 30;
inOffset.y = 51;
freqOffset.x = 52;
freqOffset.y = 30;
outOffset.x = 29;
outOffset.y = 3;
return self;
}
- init
{
written = NO;
size.width = 80.;
size.height = 80.;
center.x = size.width/2.;
center.y = size.height/2.;
strcpy(type,"Allpass");
strcpy(name,"allpass");
rvt = [[Param alloc] init:self :&rvtOffset];
in = [[Param alloc] init:self :&inOffset];
freq = [[Param alloc] init:self :&freqOffset];
out = [[Param alloc] init:self :&outOffset];
[rvt setValue:".5"]; // set non-"1" default values
[freq setValue:"440"];
[rvt setTitle:"RvbTi:"];
[freq setTitle:"LpTi"];
[in setTitle:"Input:"];
[out setTitle:"Out:"];
paramList = [[List alloc] initCount:4];
[paramList addObject:rvt];
[paramList addObject:in];
[paramList addObject:freq];
[paramList addObject:out];
[Inst putUgenInList:self];
return self;
}
- remove
{
id cp,param;
int i;
// make sure not connected first
for(i = 0; i < ([paramList count]); i++) {
param = [paramList objectAt:i];
if(cp = [param getConnectedParam])
return 0;
}
// remove ugen from list
[Inst removeUgenFromList:self];
return self;
}
- (NXImage *)getImage
{
return image;
}
- move:(NXPoint *)newloc
{
location = *newloc;
[rvt move:&location];
[in move:&location];
[freq move:&location];
[out move:&location];
return self;
}
- findParamAtPoint:(NXPoint *)point
{
NXRect *rect;
int i;
id param;
for(i = 0; i < [paramList count]; i++) {
param = [paramList objectAt:i];
rect = [param getRect];
if(NXMouseInRect(point,rect,NO))
return param;
}
return nil;
}
- writeUgen
{
BOOL ai = NO; // amplitude input ugen
char ampVar[10];
char par[20];
/* for params:
see if there is input ugen
if so, grab the output (ug?) and mufreqiply it by this
param value
if not just use the param value
after all params done, write relevant code into lists
(declarations, assignments and loop statements)
i.e. ug? = oscil(,,,,);
go to output param connected ugen and call its "writeUgen"
*/
int i;
int parent[4];
id param;
id ug;
id nupar;
char str[50];
// printf("writing ugen %d\n",index);
sprintf(str,"\tfloat ug%d;\n",index);
[Inst putVarInList:str];
sprintf(str,"\tfloat amp%d;\n",index);
[Inst putVarInList:str];
sprintf(str,"\tfloat rvt%d; // reverb time\n",index);
[Inst putVarInList:str];
sprintf(str,"\tfloat in%d;\n",index);
[Inst putVarInList:str];
sprintf(str,"\tfloat freq%d;\n",index);
[Inst putVarInList:str];
sprintf(str,"\tfloat out%d;\n",index);
[Inst putVarInList:str];
sprintf(str,"\tfloat loopt%d; // loop time\n",index);
[Inst putVarInList:str];
sprintf(str,"\tfloat *q%d;\n",index);
[Inst putVarInList:str];
sprintf(str,"\tfloat combarr%d[10000];\n",index);
[Inst putVarInList:str];
for(i = 0; i < ([paramList count]-1); i++) {
param = [paramList objectAt:i];
if(nupar = [param getConnectedParam]) {
ug = [nupar getUgen];
if([ug getWritten] == NO) {
parent[i] = [[ug writeUgen] getIndex];
}
else {
parent[i] = 0;
}
}
else
parent[i] = 0;
}
// reverb time
strcpy(par,[[paramList objectAt:0] getValue]);
if(par[0] == 'p' && par[1] == '[')
sprintf(str,"\trvt%d = %s;\n", index, par);
else
sprintf(str,"\trvt%d = %.2f;\n", index, atof(par));
[Inst putAssignInList:str];
// input sig
strcpy(par,[[paramList objectAt:1] getValue]);
if(par[0] == 'p' && par[1] == '[')
sprintf(str,"\tamp%d = %s;\n", index, par);
else
sprintf(str,"\tamp%d = %.2f;\n", index, atof(par));
[Inst putAssignInList:str];
// pitch
strcpy(par,[[paramList objectAt:2] getValue]);
if(par[0] == 'p' && par[1] == '[')
sprintf(str,"\tloopt%d = 1/%s;\n", index, par);
else
sprintf(str,"\tloopt%d = 1/%.2f;\n", index, atof(par));
[Inst putAssignInList:str];
if(parent[1]) { // input ugen
ai = YES;
sprintf(str,"\tin%d = %.2f;\n",index,
atof([[paramList objectAt:1] getValue]));
[Inst putAssignInList:str];
sprintf(str,"\tfloat inai%d;\n",index);
[Inst putVarInList:str];
sprintf(str,"\t\tinai%d = amp%d * ug%d;\n",index,
index,parent[1]);
[Inst putLoopInList:str];
}
else { // input preset or default
strcpy(par,[[paramList objectAt:0] getValue]);
if(par[0] == 'p' && par[1] == '[')
sprintf(str,"\tamp%d = %s;\n", index, par);
else
sprintf(str,"\tamp%d = %.2f;\n",index,atof(par));
[Inst putAssignInList:str];
}
if(ai)
sprintf(ampVar,"inai%d",index);
else
sprintf(ampVar,"amp%d",index);
sprintf(str,"\tnsamps = nsamps + (rvt%d * SR); // add reverbtime to out duration\n", index, index, index);
[Inst putAssignInList:str];
// allocate memory for q array
sprintf(str,"\tif((q%d = (float *)malloc((int)((loopt%d*SR+20) * 4))) == 0) {\n", index, index);
[Inst putAssignInList:str];
sprintf(str,"\t\tprintf(\"can't malloc memory for delayline\");\n\t\texit(-1);\n\t}\n");
[Inst putAssignInList:str];
// set up comb filter
sprintf(str, "\tcombset(loopt%d,rvt%d,0,q%d);\n",index,index, index);
[Inst putAssignInList:str];
// output amplitude multiplier:
strcpy(par,[[paramList objectAt:3] getValue]);
if(par[0] == 'p' && par[1] == '[')
sprintf(str,"\tout%d = %s;\n",index,par);
else
sprintf(str,"\tout%d = %.2f;\n", index, atof([[paramList objectAt:3] getValue]));
[Inst putAssignInList:str];
sprintf(str,"\t\tug%d = %s(%s,q%d) * out%d;\n", index, name, ampVar, index, index);
[Inst putLoopInList:str];
sprintf(str,"\tfree(q%d);\n", index);
[Inst putEndInList:str];
written = YES;
return self;
}
@end